{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "<h1> PTRAIL:  A <b><i>P</i></b>arallel\n",
    "<b><i>TR</i></b>ajectory\n",
    "d<b><i>A</i></b>ta\n",
    "preprocess<b><i>I</i></b>ng\n",
    "<b><i>L</i></b>ibrary\n",
    "</h1>\n",
    "\n",
    "<h2> CPU Cores Comparisons </h2>\n",
    "\n",
    "<p align='justify'>\n",
    "This Jupyter Notebook compares the working of PTRAIL\n",
    "with different number of cores. The purpose of showing such examples\n",
    "is as follows:\n",
    "\n",
    "<ol align='justify'>\n",
    "    <li> It shows how the use of\n",
    "         parallelization has helped in speeding up the execution\n",
    "         of code.\n",
    "    </li>\n",
    "    <li> It also tries to find the ideal number or proportion of\n",
    "         cores that will help in improving the execution time\n",
    "         even more.\n",
    "    </li>\n",
    "    <li> Finally, it also demonstrates that as Number of unique\n",
    "         trajectories in the dataframe increases, the speed up\n",
    "         also increases if more number of CPU cores are available\n",
    "         for processing the data.\n",
    "    </li>\n",
    "</ol>\n",
    "</p>\n",
    "\n",
    "<hr style=\"height:6px;background-color:black\">\n",
    "\n",
    "<!--------------- Dataset Section --------------------------->\n",
    "<p align='justify'>\n",
    "In this Jupyter Notebook containing comparisons, the following\n",
    "dataset are used:\n",
    "    <ul>\n",
    "        <li> <a href=\"https://github.com/YakshHaranwala/PTRAIL/blob/main/examples/data/gulls.csv\"> Seagulls Dataset </a> </li>\n",
    "        <li> <a href=\"https://github.com/YakshHaranwala/PTRAIL/blob/main/examples/data/gulls.csv\"> Seagulls Dataset </a> </li>\n",
    "        <li> <a href=\"https://github.com/YakshHaranwala/PTRAIL/blob/main/examples/data/atlantic.csv\"> Hurricane Dataset </a> </li>\n",
    "    </ul>\n",
    "</p>\n",
    "<hr style=\"height:6px;background-color:black\">\n",
    "<!--------------- NB-Viewer Link ----------------------------->\n",
    "<p align='justify'>\n",
    "Note: Viewing this notebook in GitHub will not render JavaScript\n",
    "elements. Hence, for a better experience, click the link below\n",
    "to open the Jupyter notebook in NB viewer.\n",
    "\n",
    "<span> &#8618; </span>\n",
    "<a href=\"https://nbviewer.jupyter.org/github/YakshHaranwala/PTRAIL/blob/main/examples/6.%20PyMove_Comparisons.ipynb\" target='_blank'> Click Here </a>\n",
    "</p>\n",
    "</html>"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "<p align='justify'>\n",
    "    NOTE: It is to be noted that the Spatial functions used here\n",
    "          are modified for the purposes of testing. The modifications\n",
    "          include the number of CPU cores being variable. However,\n",
    "          the actual library does not contain the changes yet and\n",
    "          such feature implementation will be thought of in future\n",
    "          after carful considerations and will be provided if it is\n",
    "          deemed necessary and reasonable.\n",
    "          <br><br>\n",
    "    After extensive testing of all the various configurations\n",
    "    of the number of CPU cores, the following conclusions\n",
    "    can be draw from them:\n",
    "\n",
    "<ul align='justify'>\n",
    "    <li> The best execution times result when the number of cores\n",
    "         being used is 2/3rds of the total number of cores\n",
    "         available in the machine.\n",
    "    </li>\n",
    "    <li> As a result, all the features in the library are optimised\n",
    "         to make the best use of the results from this experiment.\n",
    "    </li>\n",
    "</ul>\n",
    "</p>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [],
   "source": [
    "# First, lets import all the necessary modules in order\n",
    "# read the datasets from the CSV file and represent them\n",
    "# using the PTRAILDataFrame DataFrame.\n",
    "\n",
    "from ptrail.core.TrajectoryDF import PTRAILDataFrame\n",
    "import pandas as pd\n",
    "from ptrail.utilities.conversions import Conversions as con\n",
    "from time import time\n",
    "from ptrail.features.kinematic_features import KinematicFeatures as spatial\n",
    "\n",
    "processors = [1, 2, 4, 8, 11]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'core.TrajectoryDF.NumPandasTraj'>\n"
     ]
    },
    {
     "data": {
      "text/plain": "                                   lat         lon\ntraj_id DateTime                                  \n1       2008-10-23 05:53:11  39.984224  116.319402\n        2008-10-23 05:53:16  39.984211  116.319389\n        2008-10-23 05:53:21  39.984217  116.319422\n        2008-10-23 05:53:23  39.984710  116.319865\n        2008-10-23 05:53:28  39.984674  116.319810",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th></th>\n      <th>lat</th>\n      <th>lon</th>\n    </tr>\n    <tr>\n      <th>traj_id</th>\n      <th>DateTime</th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th rowspan=\"5\" valign=\"top\">1</th>\n      <th>2008-10-23 05:53:11</th>\n      <td>39.984224</td>\n      <td>116.319402</td>\n    </tr>\n    <tr>\n      <th>2008-10-23 05:53:16</th>\n      <td>39.984211</td>\n      <td>116.319389</td>\n    </tr>\n    <tr>\n      <th>2008-10-23 05:53:21</th>\n      <td>39.984217</td>\n      <td>116.319422</td>\n    </tr>\n    <tr>\n      <th>2008-10-23 05:53:23</th>\n      <td>39.984710</td>\n      <td>116.319865</td>\n    </tr>\n    <tr>\n      <th>2008-10-23 05:53:28</th>\n      <td>39.984674</td>\n      <td>116.319810</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# First, read all the csv files using pandas and store\n",
    "# them in pandas dataframe. Then, converting them all to\n",
    "# PTRAILDataFrame and then viewing the head of the PTRAILDataFrame\n",
    "# DataFrame as well as the type of the DataFrame.\n",
    "\n",
    "# 1. Geolife Dataset\n",
    "pd_geolife = pd.read_csv('./data/geolife_sample.csv')\n",
    "np_geolife = PTRAILDataFrame(data_set=pd_geolife,\n",
    "                             latitude='lat',\n",
    "                             longitude='lon',\n",
    "                             datetime='datetime',\n",
    "                             traj_id='id')\n",
    "print(type(np_geolife))\n",
    "np_geolife.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'core.TrajectoryDF.NumPandasTraj'>\n"
     ]
    },
    {
     "data": {
      "text/plain": "                               event-id  visible       lon       lat  \\\ntraj_id DateTime                                                       \n91732   2009-05-27 14:00:00  1082620685     True  24.58617  61.24783   \n        2009-05-27 20:00:00  1082620686     True  24.58217  61.23267   \n        2009-05-28 05:00:00  1082620687     True  24.53133  61.18833   \n        2009-05-28 08:00:00  1082620688     True  24.58200  61.23283   \n        2009-05-28 14:00:00  1082620689     True  24.58250  61.23267   \n\n                            sensor-type individual-taxon-canonical-name  \\\ntraj_id DateTime                                                          \n91732   2009-05-27 14:00:00         gps                    Larus fuscus   \n        2009-05-27 20:00:00         gps                    Larus fuscus   \n        2009-05-28 05:00:00         gps                    Larus fuscus   \n        2009-05-28 08:00:00         gps                    Larus fuscus   \n        2009-05-28 14:00:00         gps                    Larus fuscus   \n\n                            individual-local-identifier  \\\ntraj_id DateTime                                          \n91732   2009-05-27 14:00:00                      91732A   \n        2009-05-27 20:00:00                      91732A   \n        2009-05-28 05:00:00                      91732A   \n        2009-05-28 08:00:00                      91732A   \n        2009-05-28 14:00:00                      91732A   \n\n                                                                    study-name  \ntraj_id DateTime                                                                \n91732   2009-05-27 14:00:00  Navigation experiments in lesser black-backed ...  \n        2009-05-27 20:00:00  Navigation experiments in lesser black-backed ...  \n        2009-05-28 05:00:00  Navigation experiments in lesser black-backed ...  \n        2009-05-28 08:00:00  Navigation experiments in lesser black-backed ...  \n        2009-05-28 14:00:00  Navigation experiments in lesser black-backed ...  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th></th>\n      <th>event-id</th>\n      <th>visible</th>\n      <th>lon</th>\n      <th>lat</th>\n      <th>sensor-type</th>\n      <th>individual-taxon-canonical-name</th>\n      <th>individual-local-identifier</th>\n      <th>study-name</th>\n    </tr>\n    <tr>\n      <th>traj_id</th>\n      <th>DateTime</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th rowspan=\"5\" valign=\"top\">91732</th>\n      <th>2009-05-27 14:00:00</th>\n      <td>1082620685</td>\n      <td>True</td>\n      <td>24.58617</td>\n      <td>61.24783</td>\n      <td>gps</td>\n      <td>Larus fuscus</td>\n      <td>91732A</td>\n      <td>Navigation experiments in lesser black-backed ...</td>\n    </tr>\n    <tr>\n      <th>2009-05-27 20:00:00</th>\n      <td>1082620686</td>\n      <td>True</td>\n      <td>24.58217</td>\n      <td>61.23267</td>\n      <td>gps</td>\n      <td>Larus fuscus</td>\n      <td>91732A</td>\n      <td>Navigation experiments in lesser black-backed ...</td>\n    </tr>\n    <tr>\n      <th>2009-05-28 05:00:00</th>\n      <td>1082620687</td>\n      <td>True</td>\n      <td>24.53133</td>\n      <td>61.18833</td>\n      <td>gps</td>\n      <td>Larus fuscus</td>\n      <td>91732A</td>\n      <td>Navigation experiments in lesser black-backed ...</td>\n    </tr>\n    <tr>\n      <th>2009-05-28 08:00:00</th>\n      <td>1082620688</td>\n      <td>True</td>\n      <td>24.58200</td>\n      <td>61.23283</td>\n      <td>gps</td>\n      <td>Larus fuscus</td>\n      <td>91732A</td>\n      <td>Navigation experiments in lesser black-backed ...</td>\n    </tr>\n    <tr>\n      <th>2009-05-28 14:00:00</th>\n      <td>1082620689</td>\n      <td>True</td>\n      <td>24.58250</td>\n      <td>61.23267</td>\n      <td>gps</td>\n      <td>Larus fuscus</td>\n      <td>91732A</td>\n      <td>Navigation experiments in lesser black-backed ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2. Seagulls Dataset.\n",
    "pd_gulls = pd.read_csv('./data/gulls.csv')\n",
    "np_gulls = PTRAILDataFrame(data_set=pd_gulls,\n",
    "                         latitude='location-lat',\n",
    "                         longitude='location-long',\n",
    "                         datetime='timestamp',\n",
    "                         traj_id='tag-local-identifier',\n",
    "                         rest_of_columns=[])\n",
    "print(type(np_gulls))\n",
    "np_gulls.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'core.TrajectoryDF.NumPandasTraj'>\n"
     ]
    },
    {
     "data": {
      "text/plain": "                                             Name      Date  Time Event  \\\ntraj_id  DateTime                                                         \nAL011851 1851-06-25 00:00:00              UNNAMED  18510625     0         \n         1851-06-25 06:00:00              UNNAMED  18510625   600         \n         1851-06-25 12:00:00              UNNAMED  18510625  1200         \n         1851-06-25 18:00:00              UNNAMED  18510625  1800         \n         1851-06-25 21:00:00              UNNAMED  18510625  2100     L   \n\n                             Status   lat   lon  Maximum Wind  \\\ntraj_id  DateTime                                               \nAL011851 1851-06-25 00:00:00     HU  28.0 -94.8            80   \n         1851-06-25 06:00:00     HU  28.0 -95.4            80   \n         1851-06-25 12:00:00     HU  28.0 -96.0            80   \n         1851-06-25 18:00:00     HU  28.1 -96.5            80   \n         1851-06-25 21:00:00     HU  28.2 -96.8            80   \n\n                              Minimum Pressure  Low Wind NE  ...  Low Wind SW  \\\ntraj_id  DateTime                                            ...                \nAL011851 1851-06-25 00:00:00              -999         -999  ...         -999   \n         1851-06-25 06:00:00              -999         -999  ...         -999   \n         1851-06-25 12:00:00              -999         -999  ...         -999   \n         1851-06-25 18:00:00              -999         -999  ...         -999   \n         1851-06-25 21:00:00              -999         -999  ...         -999   \n\n                              Low Wind NW  Moderate Wind NE  Moderate Wind SE  \\\ntraj_id  DateTime                                                               \nAL011851 1851-06-25 00:00:00         -999              -999              -999   \n         1851-06-25 06:00:00         -999              -999              -999   \n         1851-06-25 12:00:00         -999              -999              -999   \n         1851-06-25 18:00:00         -999              -999              -999   \n         1851-06-25 21:00:00         -999              -999              -999   \n\n                              Moderate Wind SW  Moderate Wind NW  \\\ntraj_id  DateTime                                                  \nAL011851 1851-06-25 00:00:00              -999              -999   \n         1851-06-25 06:00:00              -999              -999   \n         1851-06-25 12:00:00              -999              -999   \n         1851-06-25 18:00:00              -999              -999   \n         1851-06-25 21:00:00              -999              -999   \n\n                              High Wind NE  High Wind SE  High Wind SW  \\\ntraj_id  DateTime                                                        \nAL011851 1851-06-25 00:00:00          -999          -999          -999   \n         1851-06-25 06:00:00          -999          -999          -999   \n         1851-06-25 12:00:00          -999          -999          -999   \n         1851-06-25 18:00:00          -999          -999          -999   \n         1851-06-25 21:00:00          -999          -999          -999   \n\n                              High Wind NW  \ntraj_id  DateTime                           \nAL011851 1851-06-25 00:00:00          -999  \n         1851-06-25 06:00:00          -999  \n         1851-06-25 12:00:00          -999  \n         1851-06-25 18:00:00          -999  \n         1851-06-25 21:00:00          -999  \n\n[5 rows x 21 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th></th>\n      <th>Name</th>\n      <th>Date</th>\n      <th>Time</th>\n      <th>Event</th>\n      <th>Status</th>\n      <th>lat</th>\n      <th>lon</th>\n      <th>Maximum Wind</th>\n      <th>Minimum Pressure</th>\n      <th>Low Wind NE</th>\n      <th>...</th>\n      <th>Low Wind SW</th>\n      <th>Low Wind NW</th>\n      <th>Moderate Wind NE</th>\n      <th>Moderate Wind SE</th>\n      <th>Moderate Wind SW</th>\n      <th>Moderate Wind NW</th>\n      <th>High Wind NE</th>\n      <th>High Wind SE</th>\n      <th>High Wind SW</th>\n      <th>High Wind NW</th>\n    </tr>\n    <tr>\n      <th>traj_id</th>\n      <th>DateTime</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th rowspan=\"5\" valign=\"top\">AL011851</th>\n      <th>1851-06-25 00:00:00</th>\n      <td>UNNAMED</td>\n      <td>18510625</td>\n      <td>0</td>\n      <td></td>\n      <td>HU</td>\n      <td>28.0</td>\n      <td>-94.8</td>\n      <td>80</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>...</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n    </tr>\n    <tr>\n      <th>1851-06-25 06:00:00</th>\n      <td>UNNAMED</td>\n      <td>18510625</td>\n      <td>600</td>\n      <td></td>\n      <td>HU</td>\n      <td>28.0</td>\n      <td>-95.4</td>\n      <td>80</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>...</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n    </tr>\n    <tr>\n      <th>1851-06-25 12:00:00</th>\n      <td>UNNAMED</td>\n      <td>18510625</td>\n      <td>1200</td>\n      <td></td>\n      <td>HU</td>\n      <td>28.0</td>\n      <td>-96.0</td>\n      <td>80</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>...</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n    </tr>\n    <tr>\n      <th>1851-06-25 18:00:00</th>\n      <td>UNNAMED</td>\n      <td>18510625</td>\n      <td>1800</td>\n      <td></td>\n      <td>HU</td>\n      <td>28.1</td>\n      <td>-96.5</td>\n      <td>80</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>...</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n    </tr>\n    <tr>\n      <th>1851-06-25 21:00:00</th>\n      <td>UNNAMED</td>\n      <td>18510625</td>\n      <td>2100</td>\n      <td>L</td>\n      <td>HU</td>\n      <td>28.2</td>\n      <td>-96.8</td>\n      <td>80</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>...</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n      <td>-999</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 21 columns</p>\n</div>"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 3. Atlantic Hurricanes. It is to be noted that apart from reading\n",
    "# the csv file, some columns of the Hurricane Dataset are also\n",
    "# to be manipulated in order to be stored as PTRAILDataFrame.\n",
    "pd_atlantic = pd.read_csv('./data/atlantic.csv')\n",
    "pd_atlantic = con.convert_directions_to_degree_lat_lon(pd_atlantic, 'Latitude',\"Longitude\")\n",
    "def convert_to_datetime(row):\n",
    "        this_date = '{}-{}-{}'.format(str(row['Date'])[0:4], str(row['Date'])[4:6], str(row['Date'])[6:])\n",
    "        this_time = '{:02d}:{:02d}:00'.format(int(row['Time']/100), int(str(row['Time'])[-2:]))\n",
    "        return '{} {}'.format(this_date, this_time)\n",
    "pd_atlantic['DateTime'] = pd_atlantic.apply(convert_to_datetime, axis=1)\n",
    "\n",
    "np_atlantic = PTRAILDataFrame(pd_atlantic,\n",
    "                            latitude='Latitude',\n",
    "                            longitude='Longitude',\n",
    "                            datetime='DateTime',\n",
    "                            traj_id='ID',\n",
    "                            rest_of_columns=[])\n",
    "print(type(np_atlantic))\n",
    "np_atlantic.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "    First of all, here seagulls dataset is used to perform\n",
    "    the following experimental steps:\n",
    "        1. Calculation of 3 spatial functions with\n",
    "           variable number of CPU cores.\n",
    "        2. Plotting the Execution time vs Number of CPU cores\n",
    "           used to demonstrate the speedup gain as the number\n",
    "           of CPUs increase.\n",
    "\"\"\"\n",
    "\n",
    "spatial_gulls_times = []\n",
    "\n",
    "# Calculate the following features 20 times using 1 processor:\n",
    "#   1. Distance_prev_to_curr.\n",
    "#   2. Distance_start_to_curr.\n",
    "#   3. Bearing_between_consecutive.\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_gulls = spatial.create_distance_between_consecutive_column(np_gulls, cpu_count=1)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_gulls, cpu_count=1)\n",
    "    spatial_gulls = spatial.create_bearing_column(spatial_gulls, cpu_count=1)\n",
    "t2 = time()\n",
    "spatial_gulls_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "# Using 2 Processors.\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_gulls = spatial.create_distance_column(np_gulls, cpu_count=2)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_gulls, cpu_count= 2)\n",
    "    spatial_gulls = spatial.create_bearing_column(spatial_gulls, cpu_count=2)\n",
    "t2 = time()\n",
    "spatial_gulls_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "# Using 4 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_gulls = spatial.create_distance_column(np_gulls, cpu_count=4)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_gulls, cpu_count= 4)\n",
    "    spatial_gulls = spatial.create_bearing_column(spatial_gulls, cpu_count=4)\n",
    "t2 = time()\n",
    "spatial_gulls_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [],
   "source": [
    "# Using 8 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_gulls = spatial.create_distance_column(np_gulls, cpu_count=8)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_gulls, cpu_count= 8)\n",
    "    spatial_gulls = spatial.create_bearing_column(spatial_gulls, cpu_count=8)\n",
    "t2 = time()\n",
    "spatial_gulls_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "# Using 12 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_gulls = spatial.create_distance_column(np_gulls, cpu_count=12)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_gulls, cpu_count= 12)\n",
    "    spatial_gulls = spatial.create_bearing_column(spatial_gulls, cpu_count=12)\n",
    "t2 = time()\n",
    "spatial_gulls_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[37.65512037277222, 22.799370765686035, 23.336839199066162, 19.78929352760315, 27.508859395980835]\n"
     ]
    },
    {
     "data": {
      "text/plain": "Text(0, 0.5, 'Execution Time (s)')"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "print(spatial_gulls_times)\n",
    "plt.plot(processors,\n",
    "         spatial_gulls_times)\n",
    "plt.title('Spatial Features using variable number of cores',\n",
    "          color='black', size=15)\n",
    "plt.xlabel('Number of CPU cores', color='grey', size=12)\n",
    "plt.ylabel('Execution Time (s)', color='grey', size=12)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [],
   "source": [
    "spatial_atlantic_times = []\n",
    "\n",
    "# Calculate the following features 20 times using 1 processor for\n",
    "# atlantic Dataset:\n",
    "#   1. Distance_prev_to_curr.\n",
    "#   2. Distance_start_to_curr.\n",
    "#   3. Bearing_between_consecutive.\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_atlantic = spatial.create_distance_column(np_atlantic, cpu_count=1)\n",
    "    spatial_atlantic = spatial.create_distance_from_start_column(spatial_atlantic, cpu_count=1)\n",
    "    spatial_atlantic = spatial.create_bearing_column(spatial_atlantic, cpu_count=1)\n",
    "t2 = time()\n",
    "spatial_atlantic_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "outputs": [],
   "source": [
    "# Using 2 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_atlantic = spatial.create_distance_column(np_atlantic, cpu_count=2)\n",
    "    spatial_atlantic = spatial.create_distance_from_start_column(spatial_atlantic, cpu_count= 2)\n",
    "    spatial_atlantic = spatial.create_bearing_column(spatial_atlantic, cpu_count=2)\n",
    "t2 = time()\n",
    "spatial_atlantic_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [],
   "source": [
    "# Using 4 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_atlantic = spatial.create_distance_column(np_atlantic, cpu_count=4)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_atlantic, cpu_count= 4)\n",
    "    spatial_atlantic = spatial.create_bearing_column(spatial_atlantic, cpu_count=4)\n",
    "t2 = time()\n",
    "spatial_atlantic_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [],
   "source": [
    "# Using 8 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_atlantic = spatial.create_distance_column(np_atlantic, cpu_count=8)\n",
    "    spatial_gulls = spatial.create_distance_from_start_column(spatial_atlantic, cpu_count= 8)\n",
    "    spatial_atlantic = spatial.create_bearing_column(spatial_atlantic, cpu_count=8)\n",
    "t2 = time()\n",
    "spatial_atlantic_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [],
   "source": [
    "# Using 12 processors:\n",
    "t1 = time()\n",
    "for i in range(20):\n",
    "    spatial_atlantic = spatial.create_distance_column(np_atlantic, cpu_count=12)\n",
    "    spatial_atlantic = spatial.create_distance_from_start_column(spatial_atlantic, cpu_count= 12)\n",
    "    spatial_atlantic = spatial.create_bearing_column(spatial_atlantic, cpu_count=12)\n",
    "t2 = time()\n",
    "spatial_atlantic_times.append(t2 - t1)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[162.94160223007202, 85.02516770362854, 70.74139785766602, 53.978840827941895, 55.43101668357849]\n"
     ]
    },
    {
     "data": {
      "text/plain": "Text(0, 0.5, 'Execution Time (s)')"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "print(spatial_atlantic_times)\n",
    "plt.plot(processors,\n",
    "         spatial_atlantic_times)\n",
    "plt.title('Spatial Features using variable number of cores',\n",
    "          color='black', size=15)\n",
    "plt.xlabel('Number of CPU cores', color='grey', size=12)\n",
    "plt.ylabel('Execution Time (s)', color='grey', size=12)\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}